package com.commerce.product.constant;

/**
 * Redis相关常量
 */
public class RedisConstant {

    /**
     * 秒杀相关Redis Key前缀
     */
    public static final String FLASH_SALE_PREFIX = "flash_sale:";
    
    /**
     * 秒杀商品库存Key前缀
     */
    public static final String FLASH_SALE_STOCK_PREFIX = "flash_sale:stock:";
    
    /**
     * 秒杀商品信息Key前缀
     */
    public static final String FLASH_SALE_PRODUCT_PREFIX = "flash_sale:product:";
    
    /**
     * 用户秒杀限制Key前缀
     */
    public static final String USER_FLASH_SALE_LIMIT_PREFIX = "user:flash_sale:limit:";
    
    /**
     * IP限流Key前缀
     */
    public static final String IP_RATE_LIMIT_PREFIX = "rate_limit:ip:";
    
    /**
     * 用户限流Key前缀
     */
    public static final String USER_RATE_LIMIT_PREFIX = "rate_limit:user:";
    
    /**
     * 分布式锁Key前缀
     */
    public static final String LOCK_PREFIX = "lock:";
    
    /**
     * 秒杀分布式锁Key前缀
     */
    public static final String FLASH_SALE_LOCK_PREFIX = "lock:flash_sale:";
    
    /**
     * 用户行为分析Key前缀
     */
    public static final String USER_BEHAVIOR_PREFIX = "user:behavior:";
    
    /**
     * 可疑用户黑名单Key前缀
     */
    public static final String SUSPICIOUS_USER_PREFIX = "suspicious:user:";
    
    /**
     * 可疑IP黑名单Key前缀
     */
    public static final String SUSPICIOUS_IP_PREFIX = "suspicious:ip:";

    /**
     * 默认过期时间（秒）
     */
    public static final long DEFAULT_EXPIRE_TIME = 3600; // 1小时
    
    /**
     * 秒杀活动过期时间（秒）
     */
    public static final long FLASH_SALE_EXPIRE_TIME = 86400; // 24小时
    
    /**
     * 限流窗口时间（秒）
     */
    public static final int RATE_LIMIT_WINDOW = 60; // 1分钟
    
    /**
     * IP限流次数
     */
    public static final int IP_RATE_LIMIT_COUNT = 100; // 每分钟100次
    
    /**
     * 用户限流次数
     */
    public static final int USER_RATE_LIMIT_COUNT = 10; // 每分钟10次
    
    /**
     * 分布式锁过期时间（秒）
     */
    public static final long LOCK_EXPIRE_TIME = 30;
    
    /**
     * 用户行为分析窗口时间（秒）
     */
    public static final int BEHAVIOR_ANALYSIS_WINDOW = 300; // 5分钟
    
    /**
     * 可疑用户封禁时间（秒）
     */
    public static final long SUSPICIOUS_USER_BAN_TIME = 3600; // 1小时

    /**
     * 构建秒杀商品库存Key
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @return Redis Key
     */
    public static String buildFlashSaleStockKey(Long flashSaleId, Long productId) {
        return FLASH_SALE_STOCK_PREFIX + flashSaleId + ":" + productId;
    }
    
    /**
     * 构建秒杀商品信息Key
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @return Redis Key
     */
    public static String buildFlashSaleProductKey(Long flashSaleId, Long productId) {
        return FLASH_SALE_PRODUCT_PREFIX + flashSaleId + ":" + productId;
    }
    
    /**
     * 构建用户秒杀限制Key
     * @param userId 用户ID
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @return Redis Key
     */
    public static String buildUserFlashSaleLimitKey(Long userId, Long flashSaleId, Long productId) {
        return USER_FLASH_SALE_LIMIT_PREFIX + userId + ":" + flashSaleId + ":" + productId;
    }
    
    /**
     * 构建IP限流Key
     * @param ip IP地址
     * @return Redis Key
     */
    public static String buildIpRateLimitKey(String ip) {
        return IP_RATE_LIMIT_PREFIX + ip;
    }
    
    /**
     * 构建用户限流Key
     * @param userId 用户ID
     * @return Redis Key
     */
    public static String buildUserRateLimitKey(Long userId) {
        return USER_RATE_LIMIT_PREFIX + userId;
    }
    
    /**
     * 构建秒杀分布式锁Key
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @param userId 用户ID
     * @return Redis Key
     */
    public static String buildFlashSaleLockKey(Long flashSaleId, Long productId, Long userId) {
        return FLASH_SALE_LOCK_PREFIX + flashSaleId + ":" + productId + ":" + userId;
    }
    
    /**
     * 构建用户行为分析Key
     * @param userId 用户ID
     * @return Redis Key
     */
    public static String buildUserBehaviorKey(Long userId) {
        return USER_BEHAVIOR_PREFIX + userId;
    }
    
    /**
     * 构建可疑用户Key
     * @param userId 用户ID
     * @return Redis Key
     */
    public static String buildSuspiciousUserKey(Long userId) {
        return SUSPICIOUS_USER_PREFIX + userId;
    }
    
    /**
     * 构建可疑IP Key
     * @param ip IP地址
     * @return Redis Key
     */
    public static String buildSuspiciousIpKey(String ip) {
        return SUSPICIOUS_IP_PREFIX + ip;
    }
}
